// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CONTENT_BROWSER_MEMORY_MEMORY_MONITOR_ANDROID_H_
#define CONTENT_BROWSER_MEMORY_MEMORY_MONITOR_ANDROID_H_

#include <jni.h>

#include "content/browser/memory/memory_monitor.h"

namespace content {

// A memory monitor for the Android system.
class CONTENT_EXPORT MemoryMonitorAndroid : public MemoryMonitor {
public:
    static std::unique_ptr<MemoryMonitorAndroid> Create();

    static bool Register(JNIEnv* env);

    // C++ counter-part of ActivityManager.MemoryInfo
    struct MemoryInfo {
        jlong avail_mem;
        jboolean low_memory;
        jlong threshold;
        jlong total_mem;
    };

    // Delegate interface used by MemoryMonitorAndroid.
    class Delegate {
    public:
        Delegate() { }
        virtual ~Delegate() {};

        // Get MemoryInfo. Implementations should fill |out| accordingly.
        virtual void GetMemoryInfo(MemoryInfo* out) = 0;
    };

    MemoryMonitorAndroid(std::unique_ptr<Delegate> delegate);
    ~MemoryMonitorAndroid() override;

    // MemoryMonitor implementation:
    int GetFreeMemoryUntilCriticalMB() override;

    // Get memory info from the Android system.
    void GetMemoryInfo(MemoryInfo* out);

    Delegate* delegate() { return delegate_.get(); }

private:
    std::unique_ptr<Delegate> delegate_;

    DISALLOW_COPY_AND_ASSIGN(MemoryMonitorAndroid);
};

} // namespace content

#endif // CONTENT_BROWSER_MEMORY_MEMORY_MONITOR_ANDROID_H_
